package com.example.filter;

import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import com.example.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
         用户登录阻拦器
         1.验证请求是否为登录
         2.验证是否存在令牌
         3.验证令牌是否正确
         4.放行
 */
@Slf4j
//@WebFilter
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        log.info("过滤器生效......");
        //获取请求的url
        String url = request.getRequestURI().toString();

        // 判断请求是否为登录
        if(url.contains("login"))
        {
            log.info("登录请求 放行---");
            chain.doFilter(req,res);
            return;
        }

        //非登录请求 获取令牌判断是否放行
        //获取请求头中token的值（令牌）
        String jwt = request.getHeader("token");

        //判断令牌是否存在
        if(!StringUtils.hasLength(jwt)){

            log.info("无令牌--");
            //返回错误信息
           Result R1 =  Result.error("NOT_LOGIN");
           //使用工具类将Result(错误信息)转换成json格式的字符串
           String notlogin = JSONObject.toJSONString(R1);
           //通过流将转换为json格式的字符串传递到前端
           response.getWriter().write(notlogin);
           return;

        }

        //解析jwt令牌是否合法
        try {
            JwtUtils.parseJwt(jwt);
        }
        catch (Exception e){
                e.printStackTrace();
            log.info("解析令牌失败（令牌超时或错误）");
            //返回错误信息
            Result R1 =  Result.error("NOT_LOGIN");
            //使用工具类将Result(错误信息)转换成json格式的字符串
            String notlogin = JSONObject.toJSONString(R1);
            //通过流将转换为json格式的字符串传递到前端
            response.getWriter().write(notlogin);
            return;
        }

        //令牌验证通过 放行请求
        log.info("令牌验证通过 放行");
        chain.doFilter(req,res);

    }


}
